import { store } from "@/store"
import axios, { AxiosRequestConfig } from "axios"
import { ElMessage, ElMessageBox } from 'element-plus'
import router from '@/router/'

let api, envMode = import.meta.env.MODE

if (envMode === "development") {
  api = import.meta.env.VITE_APP_DEVLOPMENT_API_URL
} else {
  api = import.meta.env.VITE_APP_PRODUCTION_API_URL
}


const request = axios.create({
  baseURL: api // 基础路径
})

// 控制登录过期的锁
let isRefreshing = false

// 请求拦截器
request.interceptors.request.use(
  config => {
    // 统一设置用户身份 token
    const user = store.state.user
    if (user && user.token) {
      if (!config.headers) {
        throw new Error(`Expected 'config' and 'config.headers' not to be undefined`);
      }
      config.headers.Authorization = user.token
    }
    return config
    },
  error => {
    return Promise.reject(error)
  }
)

// 响应拦截器
request.interceptors.response.use(
  response => {
    // 统一处理响应错误，例如 token 无效、服务端异常等
    const { meta } = response.data

    // 请求成功
    if (meta.status === 200 || meta.status === 201) {
      return response
    }
    
    // 处理 Token 过期
    // 错误情况：比如 token 无效...
    if (meta.status === 400) {
      // 清除本地过期的登录状态
      store.commit('setUser', null)
      // 跳转到登录页面
      router.push({
        name: 'login',
        query: {
          redirect: router.currentRoute.value.fullPath
        }
      })
      return Promise.reject(response)
    }

    // 统一处理登录过期
    if (meta.status === 410000) {
      if (isRefreshing) return Promise.reject(response)
      isRefreshing = true
      ElMessageBox.confirm('您的登录已过期，您可以取消停留在此页面，或确认重新登录', '登录过期', {
        confirmButtonText: '确认',
        cancelButtonText: '取消'
      }).then(() => {
        // 清除本地过期的登录状态
        store.commit('setUser', null)
        // 跳转到登录页面
        router.push({
          name: 'login',
          query: {
            redirect: router.currentRoute.value.fullPath
          }
        })
        // 抛出异常
      }).finally(() => {
        isRefreshing = false
      })

      // 在内部消化掉这个业务异常
      return Promise.reject(response)
    }

    // 其它错误给出提示即可，比如 400 参数错误之类的
    ElMessage({
      type: 'error',
      message: meta.msg || '请求失败，请稍后重试',
      duration: 5 * 1000
    })
    return Promise.reject(response)
  },
  err => {
    ElMessage({
      type: 'error',
      message: err.message || '请求失败，请稍后重试',
      duration: 5 * 1000
    })
    return Promise.reject(err)
  }
)

// export default request
export default (config) => {
  return request(config).then(res => {
    return res.data.data || res.data
  })
}
